جزوه · فصل چهارم · جلسه ۴۶ · سطح دسترسی ACL ← بازگشت به فهرست
📘 فصل چهارم · جلسه ۴۶ سطح دسترسی ACL
📅 تاریخ: دوشنبه، ۲۶ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی) · 📦 Red Hat
🔐 قبل از شروع، یه مثال ساده:

مجوزهای معمولی لینوکس (مالک، گروه، دیگران) مثل سه تا کلید برای یک درب هستند. اما ACL به شما اجازه می‌دهد برای هر کاربر یا گروه خاصی یک کلید جداگانه بسازید. مثلاً می‌توانید به کاربر «احمد» اجازه خواندن بدهید، به کاربر «سارا» اجازه نوشتن، و به بقیه هیچ دسترسی ندهید.

▍ ACL چیست و چرا به آن نیاز داریم؟

ACL مخفف Access Control List (لیست کنترل دسترسی) است. این یک سیستم مجوزدهی پیشرفته است که به شما امکان می‌دهد فراتر از مجوزهای معمولی (مالک، گروه، دیگران)، برای کاربران و گروه‌های خاص به‌طور جداگانه دسترسی تعیین کنید.[reference:0][reference:1]

🔑 مزیت اصلی ACL:

با استفاده از ACL می‌توانید:

  • به یک کاربر خاص دسترسی بدهید بدون اینکه او را به گروه اضافه کنید.[reference:2]
  • به یک گروه خاص دسترسی متفاوت از گروه مالک بدهید.
  • مجوزهای پیش‌فرض را برای همه فایل‌های داخل یک دایرکتوری تعیین کنید.[reference:3]
⚠️ پیش‌نیاز:

برای استفاده از ACL، باید بسته acl روی سیستم شما نصب باشد. همچنین سیستم فایل شما باید از ACL پشتیبانی کند (ext3، ext4، xfs و ...).[reference:4]

┌──(ya3in㉿kali)-[~] └─$ sudo apt install acl

▍ دو دستور اصلی ACL

📋 getfacl (مشاهده ACL)

  • نمایش لیست دسترسی‌های یک فایل یا دایرکتوری
  • مشاهده مجوزهای معمولی + مجوزهای ACL
  • خروجی قابل استفاده برای setfacl

✏️ setfacl (تنظیم ACL)

  • افزودن، تغییر یا حذف مجوزهای ACL
  • تنظیم مجوز برای کاربر یا گروه خاص
  • تنظیم مجوزهای پیش‌فرض برای دایرکتوری

▍ دستور getfacl (مشاهده ACL)

• ساختار کلی

getfacl [options] file/directory

• مثال ساده

┌──(ya3in㉿kali)-[~] └─$ getfacl file.txt # file: file.txt
# owner: ya3in
# group: ya3in
user::rw-
group::r--
other::r--

توضیح:

• گزینه‌های مهم getfacl

گزینه توضیح
-c نمایش فقط مجوزها (بدون هدر)[reference:5]
-n نمایش UID و GID به جای نام کاربر[reference:6]
-R نمایش بازگشتی برای همه فایل‌های زیردایرکتوری‌ها[reference:7]
-t نمایش به صورت جدولی[reference:8]

• تشخیص فایل‌های دارای ACL

وقتی یک فایل دارای ACL باشد، در خروجی ls -l یک علامت + (plus) در انتهای مجوزها نمایش داده می‌شود.[reference:9]

┌──(ya3in㉿kali)-[~] └─$ ls -l file.txt -rw-r--r--+ 1 ya3in ya3in 1024 Aug 17 10:00 file.txt

▍ دستور setfacl (تنظیم ACL)

• ساختار کلی

setfacl [options] rules file/directory

• فرمت قوانین ACL

قوانین ACL به این صورت نوشته می‌شوند:[reference:10]

• گزینه‌های مهم setfacl

گزینه توضیح
-m افزودن یا تغییر یک قانون ACL (modify)[reference:11]
-x حذف یک قانون ACL (remove)[reference:12]
-b حذف همه قوانین ACL (به جز قوانین پایه)[reference:13]
-k حذف قوانین پیش‌فرض (Default ACL)[reference:14]
-R اعمال تغییرات به‌صورت بازگشتی روی همه زیردایرکتوری‌ها

• مثال‌های عملی setfacl

📝 ۱. دادن دسترسی خواندن به یک کاربر خاص:
┌──(ya3in㉿kali)-[~] └─$ setfacl -m u:ahmad:r file.txt

توضیح: به کاربر ahmad اجازه خواندن (r) فایل file.txt داده می‌شود.[reference:15]

📝 ۲. دادن دسترسی نوشتن به یک گروه خاص:
┌──(ya3in㉿kali)-[~] └─$ setfacl -m g:developers:rw project.txt

توضیح: به گروه developers اجازه خواندن و نوشتن (rw) فایل project.txt داده می‌شود.[reference:16]

📝 ۳. حذف دسترسی یک کاربر:
┌──(ya3in㉿kali)-[~] └─$ setfacl -x u:ahmad file.txt

توضیح: قانون ACL مربوط به کاربر ahmad حذف می‌شود.[reference:17]

📝 ۴. تنظیم مجوز پیش‌فرض برای دایرکتوری:
┌──(ya3in㉿kali)-[~] └─$ setfacl -m d:u:ahmad:rw shared_dir/

توضیح: هر فایل جدیدی که در دایرکتوری shared_dir ساخته شود، به‌طور خودکار برای کاربر ahmad مجوز خواندن و نوشتن خواهد داشت.[reference:18]

📝 ۵. کپی کردن ACL از یک فایل به فایل دیگر:
┌──(ya3in㉿kali)-[~] └─$ getfacl file1.txt | setfacl --set-file=- file2.txt

توضیح: ACL فایل file1.txt به فایل file2.txt کپی می‌شود.[reference:19][reference:20]

⚠️ نکته مهم:

برای استفاده از setfacl روی فایل‌هایی که مالک آنها نیستید، به دسترسی root نیاز دارید.[reference:21][reference:22]

▍ ماسک (Mask) در ACL

ماسک (Mask) حداکثر مجوزی را مشخص می‌کند که یک کاربر یا گروه غیر از مالک می‌تواند داشته باشد.[reference:23]

┌──(ya3in㉿kali)-[~] └─$ setfacl -m m:rx file.txt

توضیح: ماسک را روی rx (خواندن و اجرا) تنظیم می‌کند. حتی اگر به یک کاربر rwx داده باشید، حداکثر مجوز او rx خواهد بود.

✅ تمرین پیشنهادی:
  • یک فایل تست ایجاد کنید و با getfacl مجوزهای آن را ببینید.
  • با setfacl -m u:username:rw به یک کاربر خاص دسترسی بدهید.
  • با getfacl دوباره مجوزها را بررسی کنید.
  • با setfacl -x u:username دسترسی را حذف کنید.
  • یک دایرکتوری بسازید و با setfacl -m d:u:username:rw یک مجوز پیش‌فرض تنظیم کنید.
  • یک فایل جدید در آن دایرکتوری بسازید و ببینید که مجوز به‌طور خودکار اعمال شده است.